﻿using CodeSaude.Application.Interfaces;
using CodeSaude.Application.ViewModels;
using CodeSaude.Domain.Entities;
using CodeSaude.Domain.Enums;
using CodeSaude.Infrastructure.CrossCutting.Util;
using CodeSaude.Web.Models;
using System;
using System.Collections.Generic;
using System.Web.Mvc;

namespace CodeSaude.Web.Controllers
{
    public class ProntuarioController : Controller
    {
        private readonly IProntuarioApplicationService _prontuarioApplication;
        private readonly IEspecialidadeApplicationService _especialidadeApplication;

        public ProntuarioController(IProntuarioApplicationService prontuarioApplication,
                                     IEspecialidadeApplicationService especialidadeApplication)
        {
            _prontuarioApplication = prontuarioApplication;
            _especialidadeApplication = especialidadeApplication;
        }
        
        public ActionResult Index()
        {
            ViewBag.Title = "Prontuário";
            ProntuarioViewModel model = new ProntuarioViewModel();
            
            foreach (ProntuarioViewModel item in _prontuarioApplication.GetAll())
            {
                ProntuarioDTO prontDTO = new ProntuarioDTO();
                prontDTO.ProntuarioId = item.ProntuarioId.ToString();
                prontDTO.Atendimento = item.ProntuarioId.ToString();
                prontDTO.EscalaDor = "/images/smile-" + item.IdEscalaDor.ToString() + ".png";
                prontDTO.NomePessoa = item.NomePessoa;
                prontDTO.IdEspecialidade = item.Especialidade.EspecialidadeId.ToString();
                prontDTO.NomeEspecialidade = item.Especialidade.NomeEspecialidade;
                prontDTO.DataAtendimento = item.DataAtendimento.Value.ToString();

                if (item.DataAtendimento.HasValue)
                {
                    DateTime dt = item.DataAtendimento.Value;
                    DateTime dt1 = DateTime.Now;
                    TimeSpan duration = dt1 - dt;
                    long durationTicks = Math.Abs(duration.Ticks / TimeSpan.TicksPerMillisecond);
                    long hours = durationTicks / (1000 * 60 * 60);
                    long minutes = (durationTicks - (hours * 60 * 60 * 1000)) / (1000 * 60);

                    prontDTO.TempoEspera = hours.ToString("00") + ":" + minutes.ToString("00");
                }
                else
                {
                    prontDTO.TempoEspera = string.Empty;
                }

                prontDTO.Destino = item.Destino;
                prontDTO.Prioridade = item.Prioridade;
                model.Prontuarios.Add(prontDTO);
            }

            if (TempData["mensagem"] != null)
            {
                ViewBag.Mensagem = TempData["mensagem"] as Mensagem;
                // Mantendo o dado do TempData até a próxima leitura (requisição).
                //TempData.Keep("Mensagem");
            }

            return View(model);
        }

        public ActionResult Create()
        {
            ViewBag.Title = "Inserir Prontuário";
            ProntuarioViewModel model = new ProntuarioViewModel();
            model.ListaEspecialidades = GetEspecialidades();
            model.ListaPrioridades = GetPrioridades();
            model.ListaDestinos = GetDestinos();

            return View("CreateEdit", model);
        }

        [HttpPost]
        public ActionResult Create(ProntuarioViewModel model)
        {
            Mensagem msg = null;
            try
            {
                model.DataAtendimento = DateTime.Now;

                //if (model.ProntuarioAvaliacao != null)
                //{
                //    model.ListaProntuarioAvaliacao.Add(model.ProntuarioAvaliacao);
                //}

                if (ModelState.IsValid)
                {
                    _prontuarioApplication.Create(model);
                    msg = new Mensagem()
                    {
                        Conteudo = "Prontuario cadastrado com sucesso",
                        tipoMensagem = TipoMensagem.SUCESSO
                    };
                }
                else
                {
                    msg = new Mensagem()
                    {
                        Conteudo = "Confira os campos e tente novamente",
                        tipoMensagem = TipoMensagem.ATENCAO
                    };
                }

                TempData["mensagem"] = msg;
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                msg = new Mensagem()
                {
                    Conteudo = string.Concat("Erro ao salvar prontuario. Detalhes: ", ex.Message),
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }

        public ActionResult Edit(string id)
        {
            try
            {
                // id = idProntuario|idEspecialidade
                string[] arrayID = id.Split('|');
                int idProntuario = Convert.ToInt32(arrayID[0]);
                int idEspecialidade = Convert.ToInt32(arrayID[1]);

                ViewBag.Title = "Alterar prontuario";
                ProntuarioViewModel model = new ProntuarioViewModel();
                model = _prontuarioApplication.GetById(idProntuario, idEspecialidade);

                model.ListaSituacoes = EnumUtil.GetEnumSelectList<SituacaoEnum>(1);
                model.ListaEspecialidades = GetEspecialidades();
                model.ListaPrioridades = GetPrioridades();
                model.ListaDestinos = GetDestinos();

                return View("CreateEdit", model);
            }
            catch (Exception ex)
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Não foi possível carregar o prontuario",
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["mensagem"] = msg;
                return RedirectToAction("Index");
            }

        }

        [HttpPost]
        public ActionResult Edit(ProntuarioViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _prontuarioApplication.Update(model);

                    Mensagem msg = new Mensagem()
                    {
                        Conteudo = "Prontuario alterado com sucesso",
                        tipoMensagem = TipoMensagem.SUCESSO
                    };

                    TempData["mensagem"] = msg;
                }

                return RedirectToAction("Index");
            }
            catch
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Erro ao alterar prontuario",
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }

        [HttpPost]
        public ActionResult Delete(int id)
        {
            try
            {
                ProntuarioViewModel leito = _prontuarioApplication.GetById(id);
                _prontuarioApplication.Delete(leito);

                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Prontuario excluído com sucesso",
                    tipoMensagem = TipoMensagem.SUCESSO
                };

                TempData["mensagem"] = msg;
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = string.Concat("Erro ao excluir prontuario. Detalhes: ", ex.Message),
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }
        
        private List<SelectListItem> GetDestinos()
        {
            List<SelectListItem> itensDestino = new List<SelectListItem>();
            foreach (DestinoEnum val in Enum.GetValues(typeof(DestinoEnum)))
            {
                itensDestino.Add(new SelectListItem() { Value = ((int)val).ToString(), Text = Enum.GetName(typeof(DestinoEnum), val) });
            }

            return itensDestino;
        }

        private List<SelectListItem> GetPrioridades()
        {
            List<SelectListItem> itensPrioridade = new List<SelectListItem>();
            foreach (PrioridadeEnum val in Enum.GetValues(typeof(PrioridadeEnum)))
            {
                itensPrioridade.Add(new SelectListItem() { Value = ((int)val).ToString(), Text = Enum.GetName(typeof(PrioridadeEnum), val) });
            }

            return itensPrioridade;
        }

        private List<SelectListItem> GetEspecialidades()
        {
            List<SelectListItem> itensEspecialidade = new List<SelectListItem>();
            foreach (EspecialidadeViewModel item in _especialidadeApplication.GetAll())
            {
                itensEspecialidade.Add(new SelectListItem() { Value = item.EspecialidadeId.ToString(), Text = item.NomeEspecialidade });
            }
            
            return itensEspecialidade;
        }
    }
}
